package smallfrench.moteur.biblio.igu;

import java.util.ArrayList;
import java.util.List;

import smallfrench.moteur.biblio.AVecteur2;

/**
 * Représente une transformation affine.
 * @author antoine1023
 */
public final class Transformation {

	/** Coordonées des axes par rapport à l'origine */
	public final double xx, xy, yx, yy;

	/** Coordonées de l'origine (translation) */
	public final double ox, oy;

	public Transformation() {
		xx = 1.0; xy = 0.0;
		yx = 0.0; yy = 1.0;
		ox = oy = 0.0;
	}

	public Transformation(
			double xx, double xy,
			double yx, double yy,
			double ox, double oy) {

		this.xx = xx; this.xy = xy;
		this.yx = yx; this.yy = yy;
		this.ox = ox; this.oy = oy;
	}

	AVecteur2 transformer(AVecteur2 v) {
		return new AVecteur2(
				xx * v.x + yx * v.y + ox,
				xy * v.x + yy * v.y + oy);
	}

	AVecteur2 transformer(double vx, double vy) {
		return new AVecteur2(
				xx * vx + yx * vy + ox,
				xy * vx + yy * vy + oy);
	}

	/**
	 * Transforme une liste de {@link AVecteur2}.
	 * @param al
	 * @return Une liste des vecteurs transformés.
	 */
	ArrayList<AVecteur2> transformer(List<AVecteur2> al) {

		ArrayList<AVecteur2> r = new ArrayList<AVecteur2>(al.size());

		for (int i = 0; i < al.size(); i++) {
			AVecteur2 v = al.get(i);
			double vx = v.x, vy = v.y;
			r.add(new AVecteur2(
					xx * vx + yx * vy + ox,
					xy * vx + yy * vy + oy));
		}

		return r;
	}

	@Override
	public String toString() {
		return "(" + xx + " " + xy + ")\n(" + yx + " " + yy + ")";
	}
}
